Notify mapped state to the accessible object directly
authorEmmanuele Bassi <ebassi@gnome.org>
Wed, 22 Apr 2020 19:25:48 +0000 (20:25 +0100)
committerEmmanuele Bassi <ebassi@gnome.org>
Fri, 5 Jun 2020 19:32:27 +0000 (20:32 +0100)
Do not use signal connections: if we have an accessible object, notify
it directly when getting mapped and unmapped.

gtk/a11y/gtkwidgetaccessible.c
gtk/a11y/gtkwidgetaccessibleprivate.h
gtk/gtkwidget.c

index 9725d00f2e0346cacb45986a8b9fd915cca66223..ddd16a0cd675df7c2028d332d73b8246500aebc4 100644 (file)
@@ -76,16 +76,23 @@ gtk_widget_accessible_update_bounds (GtkWidgetAccessible *self)
   g_signal_emit_by_name (self, "bounds-changed", &rect);
 }
 
-/* Translate GtkWidget mapped state into AtkObject showing */
-static gint
-map_cb (GtkWidget *widget)
+/*< private >
+ * gtk_widget_accessible_notify_showing:
+ * @self: a #GtkWidgetAccessible
+ *
+ * Translates the #GtkWidget mapped state into the #AtkObject
+ * showing state.
+ */
+void
+gtk_widget_accessible_notify_showing (GtkWidgetAccessible *self)
 {
-  AtkObject *accessible;
+  g_return_if_fail (GTK_IS_WIDGET_ACCESSIBLE (self));
+
+  GtkWidget *widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (self));
 
-  accessible = gtk_widget_get_accessible (widget);
-  atk_object_notify_state_change (accessible, ATK_STATE_SHOWING,
+  atk_object_notify_state_change (ATK_OBJECT (self),
+                                  ATK_STATE_SHOWING,
                                   gtk_widget_get_mapped (widget));
-  return 1;
 }
 
 static void
@@ -97,8 +104,6 @@ gtk_widget_accessible_initialize (AtkObject *obj,
   widget = GTK_WIDGET (data);
 
   g_signal_connect (widget, "notify", G_CALLBACK (notify_cb), NULL);
-  g_signal_connect (widget, "map", G_CALLBACK (map_cb), NULL);
-  g_signal_connect (widget, "unmap", G_CALLBACK (map_cb), NULL);
 
   GTK_WIDGET_ACCESSIBLE (obj)->priv->layer = ATK_LAYER_WIDGET;
   obj->role = ATK_ROLE_UNKNOWN;
index ac60f0e43d5f0a8a9a7774104579476299e367f1..e1f210bb3558ead791e449bdc35876a833a6b12e 100644 (file)
@@ -25,7 +25,9 @@ G_BEGIN_DECLS
 void _gtk_widget_accessible_set_layer (GtkWidgetAccessible *accessible,
                                        AtkLayer             layer);
 
-void gtk_widget_accessible_update_bounds (GtkWidgetAccessible *self);
+void    gtk_widget_accessible_update_bounds     (GtkWidgetAccessible *self);
+
+void    gtk_widget_accessible_notify_showing    (GtkWidgetAccessible *self);
 
 G_END_DECLS
 
index 0b2319734275eac9bc6d06328471a25fa406f140..de02f2b3ae252f0fd4e798b064571e797d41c285 100644 (file)
@@ -2754,11 +2754,16 @@ gtk_widget_map (GtkWidget *widget)
 
   if (!_gtk_widget_get_mapped (widget))
     {
+      GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
+
       gtk_widget_push_verify_invariants (widget);
 
       if (!_gtk_widget_get_realized (widget))
         gtk_widget_realize (widget);
 
+      if (priv->accessible != NULL)
+        gtk_widget_accessible_notify_showing (GTK_WIDGET_ACCESSIBLE (priv->accessible));
+
       g_signal_emit (widget, widget_signals[MAP], 0);
 
       update_cursor_on_state_change (widget);
@@ -2783,6 +2788,8 @@ gtk_widget_unmap (GtkWidget *widget)
 
   if (_gtk_widget_get_mapped (widget))
     {
+      GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
+
       g_object_ref (widget);
       gtk_widget_push_verify_invariants (widget);
 
@@ -2791,6 +2798,9 @@ gtk_widget_unmap (GtkWidget *widget)
 
       g_signal_emit (widget, widget_signals[UNMAP], 0);
 
+      if (priv->accessible != NULL)
+        gtk_widget_accessible_notify_showing (GTK_WIDGET_ACCESSIBLE (priv->accessible));
+
       update_cursor_on_state_change (widget);
 
       gtk_widget_pop_verify_invariants (widget);